package administracion;

import java.util.ArrayList;
import java.util.List;

import dao.ClienteDAO;
import dto.Cliente.DTO_Cliente;
import dto.Cliente.DTO_CuentaCorriente;
import dto.Cliente.DTO_DetalleFacturaCliente;
import dto.Cliente.DTO_DetalleReciboPago;
import dto.Cliente.DTO_DireccionEntrega;
import dto.Cliente.DTO_FacturaCliente;
import dto.Cliente.DTO_ProductoCliente;
import dto.Cliente.DTO_ReciboPago;
import entity.Cliente.Entity_Cliente;
import entity.Cliente.Entity_CuentaCorriente;
import entity.Cliente.Entity_DetalleFacturaCliente;
import entity.Cliente.Entity_DetalleReciboPago;
import entity.Cliente.Entity_DireccionEntrega;
import entity.Cliente.Entity_FacturaCliente;
import entity.Cliente.Entity_ProductoCliente;
import entity.Cliente.Entity_ReciboPago;

public class Gestor_Cliente {
private static Gestor_Cliente instancia;
	
	private Gestor_Cliente(){
		
	}
	
	public static Gestor_Cliente getInstancia(){
		if(instancia == null){
			instancia = new Gestor_Cliente();
		} 
		return instancia;
	}
	
	
	public void altaCliente(DTO_Cliente cliente){
		Entity_CuentaCorriente cc = new Entity_CuentaCorriente();
		cc.setLimiteCredito(cliente.getCuentaCorriente().getLimiteCredito());
		cc.setCredito(cliente.getCuentaCorriente().getCredito());
		cc.setFormaPago(cliente.getCuentaCorriente().getFormaPago());
		
		Entity_Cliente c = new Entity_Cliente();
		c.setRazonSocial(cliente.getRazonSocial());
		c.setCuit(cliente.getCuit());
		c.setDireccion(cliente.getDireccion());
		c.setCodigoPostal(cliente.getCodigoPostal());
		c.setLocalidad(cliente.getLocalidad());
		c.setProvincia(cliente.getProvincia());
		c.setPais(cliente.getPais());
		c.setEmail(cliente.getEmail());
		c.setTelefono(cliente.getTelefono());
		c.setCuentaCorriente(cc);
		cc.setCliente(c);
		
		ClienteDAO.getInstancia().altaCliente(c);
	}
	public void modificarCliente(DTO_Cliente cliente){
		Entity_CuentaCorriente cc = ClienteDAO.getInstancia().getCuentaCorriente(cliente.getCuentaCorriente().getId());
		Entity_Cliente c = new Entity_Cliente();
		c.setId(cliente.getId());
		c.setRazonSocial(cliente.getRazonSocial());
		c.setCuit(cliente.getCuit());
		c.setDireccion(cliente.getDireccion());
		c.setCodigoPostal(cliente.getCodigoPostal());
		c.setLocalidad(cliente.getLocalidad());
		c.setProvincia(cliente.getProvincia());
		c.setPais(cliente.getPais());
		c.setEmail(cliente.getEmail());
		c.setTelefono(cliente.getTelefono());
		c.setCuentaCorriente(cc);
		
		ClienteDAO.getInstancia().modificarCliente(c);
	}
	public void bajaCliente(Integer idCliente){
		Entity_Cliente c = ClienteDAO.getInstancia().getCliente(idCliente);
		if(c!= null){
			ClienteDAO.getInstancia().bajaCliente(c);
		}
	}
	public DTO_Cliente getCliente(Integer idCliente){
		return ClienteDAO.getInstancia().getCliente(idCliente).toDTO();
	}

	public void actualizarCuentaCorriente(DTO_CuentaCorriente cuentaCorriente){
		Entity_CuentaCorriente cc = new Entity_CuentaCorriente();
		cc.setId(cuentaCorriente.getId());
		cc.setCredito(cuentaCorriente.getCredito());
		cc.setLimiteCredito(cuentaCorriente.getLimiteCredito());
		cc.setFormaPago(cuentaCorriente.getFormaPago());
		ClienteDAO.getInstancia().modificarCuentaCorriente(cc);
	}

	public void altaFacturaCliente(DTO_FacturaCliente factura){
		
		Entity_CuentaCorriente cc  = ClienteDAO.getInstancia().getCuentaCorriente(factura.getIdCuentaCorriente());
		Entity_FacturaCliente fc = new Entity_FacturaCliente();
		fc.setTipo(factura.getTipo());
		fc.setFecha(factura.getFecha());
		fc.setVencimiento(factura.getVencimiento());
		fc.setTotal(factura.getTotal());
		fc.setCuentaCorriente(cc);

		List<Entity_DetalleFacturaCliente> detalleFactura = new ArrayList<Entity_DetalleFacturaCliente>();
		for(DTO_DetalleFacturaCliente d: factura.getDetalle()){
			Entity_DetalleFacturaCliente df = new Entity_DetalleFacturaCliente();
			df.setLinea(d.getLinea());
			df.setDescripcion(d.getDescripcion());	
			df.setSubtotal(d.getSubtotal());
			
			detalleFactura.add(df);
		}
		fc.setDetalle(detalleFactura);
		
		ClienteDAO.getInstancia().altaFacturaCliente(fc);
	}
	public void modificarFacturaCliente(DTO_FacturaCliente factura){
		Entity_CuentaCorriente cc  = ClienteDAO.getInstancia().getCuentaCorriente(factura.getIdCuentaCorriente());
		Entity_FacturaCliente fc = new Entity_FacturaCliente();
		fc.setId(factura.getId());
		fc.setTipo(factura.getTipo());
		fc.setFecha(factura.getFecha());
		fc.setVencimiento(factura.getVencimiento());
		fc.setTotal(factura.getTotal());
		fc.setCuentaCorriente(cc);

		List<Entity_DetalleFacturaCliente> detalleFactura = new ArrayList<Entity_DetalleFacturaCliente>();
		for(DTO_DetalleFacturaCliente d: factura.getDetalle()){
			Entity_DetalleFacturaCliente df = new Entity_DetalleFacturaCliente();
			df.setLinea(d.getLinea());
			df.setDescripcion(d.getDescripcion());	
			df.setSubtotal(d.getSubtotal());
			
			detalleFactura.add(df);
		}
		fc.setDetalle(detalleFactura);
		
		ClienteDAO.getInstancia().modificarFacturaCliente(fc);
	}
	public DTO_FacturaCliente getFacturaCliente(Integer idCliente){
		return ClienteDAO.getInstancia().getFacturaCliente(idCliente).toDTO();
	}
	public void altaReciboPago(DTO_ReciboPago recibo){
		Entity_ReciboPago r = new Entity_ReciboPago();
		r.setFecha(recibo.getFecha());
		r.setMonto(recibo.getMonto());
		
		List<Entity_DetalleReciboPago> detalle = new ArrayList<Entity_DetalleReciboPago>();
		for(DTO_DetalleReciboPago d: recibo.getDetalle()){
			Entity_FacturaCliente f = ClienteDAO.getInstancia().getFacturaCliente(d.getIdFactura());
			Entity_DetalleReciboPago dr = new Entity_DetalleReciboPago();
			dr.setMonto(d.getMontoPagado());
			dr.setFactura(f);
			detalle.add(dr);
		}
		r.setDetalle(detalle);
		
		ClienteDAO.getInstancia().altaReciboPago(r);
		
	}
	public void modificarReciboPago(DTO_ReciboPago recibo){
		Entity_ReciboPago r = new Entity_ReciboPago();
		r.setId(recibo.getId());
		r.setFecha(recibo.getFecha());
		r.setMonto(recibo.getMonto());
		
		List<Entity_DetalleReciboPago> detalle = new ArrayList<Entity_DetalleReciboPago>();
		for(DTO_DetalleReciboPago d: recibo.getDetalle()){
			Entity_FacturaCliente f = ClienteDAO.getInstancia().getFacturaCliente(d.getIdFactura());
			Entity_DetalleReciboPago dr = new Entity_DetalleReciboPago();
			dr.setId(d.getId());
			dr.setMonto(d.getMontoPagado());
			dr.setFactura(f);
			detalle.add(dr);
		}
		r.setDetalle(detalle);
		
		ClienteDAO.getInstancia().altaReciboPago(r);
	}
	public DTO_ReciboPago getReciboPago(Integer idCliente){
		return ClienteDAO.getInstancia().getReciboPago(idCliente).toDTO();
	}
	public void altaDireccionEntrega(DTO_DireccionEntrega direccion){
		Entity_Cliente c = null;
		int posicion = 1;
		if(direccion.getIdCliente() != null){
			c = ClienteDAO.getInstancia().getCliente(direccion.getIdCliente());
			posicion = c.getDireccionesEntrega().size() + 1;
		}
			
		Entity_DireccionEntrega d = new Entity_DireccionEntrega();
		d.setPosicion(posicion);
		d.setDireccion(direccion.getDireccion());
		d.setCliente(c);
		d.setCodigoPostal(direccion.getCodigoPostal());
		d.setLocalidad(direccion.getLocalidad());
		d.setProvincia(direccion.getProvincia());
		d.setPais(direccion.getPais());
		d.setHorarioEntrega(direccion.getHorarioEntrega());
		d.setDiasEntrega(direccion.getDiasEntrega());
		ClienteDAO.getInstancia().altaDireccionEntrega(d);
	}
	public void modificarDireccionEntrega(DTO_DireccionEntrega direccion){
		Entity_DireccionEntrega d = new Entity_DireccionEntrega();
		d.setId(direccion.getId());
		d.setPosicion(direccion.getPosicion());
		d.setDireccion(direccion.getDireccion());
		d.setCodigoPostal(direccion.getCodigoPostal());
		d.setLocalidad(direccion.getLocalidad());
		d.setProvincia(direccion.getProvincia());
		d.setPais(direccion.getPais());
		d.setHorarioEntrega(direccion.getHorarioEntrega());
		d.setDiasEntrega(direccion.getDiasEntrega());
		ClienteDAO.getInstancia().modificarDireccionEntrega(d);
	}
	public void bajaDireccionEntrega(Integer idDireccion){
		Entity_DireccionEntrega d = ClienteDAO.getInstancia().getDireccionEntrega(idDireccion);
		if (d != null)
			ClienteDAO.getInstancia().bajaDireccionEntrega(d);
	}
	public DTO_DireccionEntrega getDireccionEntrega(Integer idDireccion){
		return ClienteDAO.getInstancia().getDireccionEntrega(idDireccion).toDTO();
	}
	
	public void altaProductoCliente(DTO_ProductoCliente producto){
		Entity_Cliente cliente = null;
		if(producto.getIdCliente() != null)
			cliente = ClienteDAO.getInstancia().getCliente(producto.getIdCliente());
		
		Entity_ProductoCliente pc = new Entity_ProductoCliente();
		pc.setCodigo(producto.getCodigo());
		pc.setDescripcion(producto.getDescripcion());
		pc.setCategoria(producto.getCategoria());
		pc.setUnidad(producto.getUnidad());
		pc.setCliente(cliente);
		
		ClienteDAO.getInstancia().altaProductoCliente(pc);
	}
	public void modificarProductoCliente(DTO_ProductoCliente producto){

		Entity_ProductoCliente pc = ClienteDAO.getInstancia().getProductoCliente(producto.getId());
		pc.setCodigo(producto.getCodigo());
		pc.setDescripcion(producto.getDescripcion());
		pc.setCategoria(producto.getCategoria());
		pc.setUnidad(producto.getUnidad());
		ClienteDAO.getInstancia().modificarProductoCliente(pc);
	}
	public void bajaProductoCliente(Integer idProducto){
		Entity_ProductoCliente p = ClienteDAO.getInstancia().getProductoCliente(idProducto);
		if (p != null)
			ClienteDAO.getInstancia().bajaProductoCliente(p);
	}
	public DTO_ProductoCliente getProductoCliente(Integer idProducto){
		return ClienteDAO.getInstancia().getProductoCliente(idProducto).toDTO();
	}
	
	public List<DTO_Cliente> listarClientes(){
		List<Entity_Cliente> clientes = ClienteDAO.getInstancia().listarClientes();
		List<DTO_Cliente> clientesDTO = new ArrayList<DTO_Cliente>();
		for(Entity_Cliente cliente : clientes){
			clientesDTO.add(cliente.toDTO());
		}
		return clientesDTO;
	}
	
	public List<DTO_FacturaCliente> listarFacturasClientePendientes(){
		List<Entity_FacturaCliente> facturas = ClienteDAO.getInstancia().listarFacturasClientePendientes();
		List<DTO_FacturaCliente> facturasDTO = new ArrayList<DTO_FacturaCliente>();
		for(Entity_FacturaCliente factura : facturas){
			facturasDTO.add(factura.toDTO());
		}
		return facturasDTO;
	}
	public List<DTO_FacturaCliente> listarFacturasClientePendientes(Integer idCliente){
		List<Entity_FacturaCliente> facturas = ClienteDAO.getInstancia().listarFacturasClientePendientes(idCliente);
		List<DTO_FacturaCliente> facturasDTO = new ArrayList<DTO_FacturaCliente>();
		for(Entity_FacturaCliente factura : facturas){
			facturasDTO.add(factura.toDTO());
		}
		return facturasDTO;
	}
	public List<DTO_FacturaCliente> listarFacturasCliente(Integer idCliente){
		List<Entity_FacturaCliente> facturas = ClienteDAO.getInstancia().listarFacturasCliente(idCliente);
		List<DTO_FacturaCliente> facturasDTO = new ArrayList<DTO_FacturaCliente>();
		for(Entity_FacturaCliente factura : facturas){
			facturasDTO.add(factura.toDTO());
		}
		return facturasDTO;
	}
	
	
	public List<DTO_ReciboPago> listarRecibos(){
		List<Entity_ReciboPago> recibos = ClienteDAO.getInstancia().listarRecibos();
		List<DTO_ReciboPago> recibosDTO = new ArrayList<DTO_ReciboPago>();
		for(Entity_ReciboPago recibo : recibos){
			recibosDTO.add(recibo.toDTO());
		}
		return recibosDTO;
	}
	public List<DTO_ReciboPago> listarRecibos(Integer idCliente){
		List<Entity_ReciboPago> recibos = ClienteDAO.getInstancia().listarRecibos(idCliente);
		List<DTO_ReciboPago> recibosDTO = new ArrayList<DTO_ReciboPago>();
		for(Entity_ReciboPago recibo : recibos){
			recibosDTO.add(recibo.toDTO());
		}
		return recibosDTO;
	}
	
	public List<DTO_DireccionEntrega> listarDireccionEntrega(Integer idCliente){
		List<Entity_DireccionEntrega> direcciones = ClienteDAO.getInstancia().listarDireccionEntrega(idCliente);
		List<DTO_DireccionEntrega> direccionesDTO = new ArrayList<DTO_DireccionEntrega>();
		for(Entity_DireccionEntrega direccion : direcciones){
			direccionesDTO.add(direccion.toDTO());
		}
		return direccionesDTO;
	}
	
	public List<DTO_ProductoCliente> listarProductoCliente(Integer idCliente){
		List<Entity_ProductoCliente> productos = ClienteDAO.getInstancia().listarProductoCliente(idCliente);
		List<DTO_ProductoCliente> productosDTO = new ArrayList<DTO_ProductoCliente>();
		for(Entity_ProductoCliente producto : productos){
			productosDTO.add(producto.toDTO());
		}
		return productosDTO;
	}
	

}